nusing System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;

// 图书实体类（封装图书信息）
public class Book
{
    /// <summary>
    /// 图书编号（唯一标识）
    /// </summary>
    public int Id { get; set; }
    
    /// <summary>
    /// 书名
    /// </summary>
    public string Title { get; set; }
    
    /// <summary>
    /// 作者
    /// </summary>
    public string Author { get; set; }
    
    /// <summary>
    /// 出版社
    /// </summary>
    public string Publisher { get; set; }
    
    /// <summary>
    /// 出版日期
    /// </summary>
    public DateTime PublishDate { get; set; }
    
    /// <summary>
    /// 价格
    /// </summary>
    public decimal Price { get; set; }

    // 重写ToString，方便控制台显示
    public override string ToString()
    {
        return $"编号：{Id}\n书名：{Title}\n作者：{Author}\n出版社：{Publisher}\n出版日期：{PublishDate:yyyy-MM-dd}\n价格：{Price:F2}元\n{new string('-', 30)}";
    }
}

// 图书管理核心类（处理业务逻辑）
public class BookManager
{
    // 图书列表（内存存储）
    private List<Book> _books = new List<Book>();
    // 数据文件路径（当前目录下的books.json）
    private readonly string _filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "books.json");

    /// <summary>
    /// 构造函数：启动时自动加载文件中的图书数据
    /// </summary>
    public BookManager()
    {
        LoadBooksFromFile();
    }

    /// <summary>
    /// 新增图书
    /// </summary>
    public void AddBook(Book book)
    {
        // 检查编号是否重复
        if (_books.Exists(b => b.Id == book.Id))
        {
            Console.WriteLine($"错误：编号{book.Id}已存在，无法新增！");
            return;
        }
        _books.Add(book);
        Console.WriteLine("新增图书成功！");
    }

    /// <summary>
    /// 编辑图书（按编号修改）
    /// </summary>
    public void EditBook(int bookId, Book newBookInfo)
    {
        var book = _books.Find(b => b.Id == bookId);
        if (book == null)
        {
            Console.WriteLine($"错误：编号{bookId}的图书不存在！");
            return;
        }

        // 更新信息（保留原编号，避免修改唯一标识）
        book.Title = newBookInfo.Title;
        book.Author = newBookInfo.Author;
        book.Publisher = newBookInfo.Publisher;
        book.PublishDate = newBookInfo.PublishDate;
        book.Price = newBookInfo.Price;

        Console.WriteLine("编辑图书成功！");
    }

    /// <summary>
    /// 删除图书（按编号）
    /// </summary>
    public void DeleteBook(int bookId)
    {
        var book = _books.Find(b => b.Id == bookId);
        if (book == null)
        {
            Console.WriteLine($"错误：编号{bookId}的图书不存在！");
            return;
        }

        _books.Remove(book);
        Console.WriteLine("删除图书成功！");
    }

    /// <summary>
    /// 查看所有图书
    /// </summary>
    public void ShowAllBooks()
    {
        if (_books.Count == 0)
        {
            Console.WriteLine("暂无图书数据！");
            return;
        }

        Console.WriteLine("\n===== 图书列表 =====");
        foreach (var book in _books)
        {
            Console.WriteLine(book);
        }
    }

    /// <summary>
    /// 保存图书列表到JSON文件
    /// </summary>
    public void SaveBooksToFile()
    {
        try
        {
            // 序列化JSON（格式化输出，便于阅读）
            var jsonOptions = new JsonSerializerOptions { WriteIndented = true };
            string json = JsonSerializer.Serialize(_books, jsonOptions);
            
            // 写入文件
            File.WriteAllText(_filePath, json);
            Console.WriteLine($"保存成功！数据文件路径：{_filePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"保存失败：{ex.Message}");
        }
    }

    /// <summary>
    /// 从JSON文件加载图书数据
    /// </summary>
    private void LoadBooksFromFile()
    {
        // 如果文件不存在，直接返回
        if (!File.Exists(_filePath))
        {
            Console.WriteLine("未找到图书数据文件，将创建新文件！");
            return;
        }

        try
        {
            // 读取并反序列化JSON
            string json = File.ReadAllText(_filePath);
            _books = JsonSerializer.Deserialize<List<Book>>(json) ?? new List<Book>();
            Console.WriteLine($"成功加载{_books.Count}条图书数据！");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"加载数据失败：{ex.Message}，将使用空列表！");
            _books = new List<Book>();
        }
    }
}

// 控制台交互主程序
class Program
{
    static void Main(string[] args)
    {
        BookManager bookManager = new BookManager();
        bool isRunning = true;

        // 主菜单循环
        while (isRunning)
        {
            Console.WriteLine("\n===== 图书编辑系统 =====");
            Console.WriteLine("1. 新增图书");
            Console.WriteLine("2. 编辑图书");
            Console.WriteLine("3. 删除图书");
            Console.WriteLine("4. 查看所有图书");
            Console.WriteLine("5. 保存数据到文件");
            Console.WriteLine("0. 退出系统");
            Console.Write("请选择操作（0-5）：");
            string choice = Console.ReadLine()?.Trim() ?? "";

            switch (choice)
            {
                case "1":
                    AddBookMenu(bookManager);
                    break;
                case "2":
                    EditBookMenu(bookManager);
                    break;
                case "3":
                    DeleteBookMenu(bookManager);
                    break;
                case "4":
                    bookManager.ShowAllBooks();
                    break;
                case "5":
                    bookManager.SaveBooksToFile();
                    break;
                case "0":
                    // 退出前自动保存
                    bookManager.SaveBooksToFile();
                    Console.WriteLine("已自动保存数据，系统退出！");
                    isRunning = false;
                    break;
                default:
                    Console.WriteLine("无效选项，请重新选择！");
                    break;
            }
        }
    }

    // 新增图书的交互菜单
    static void AddBookMenu(BookManager manager)
    {
        try
        {
            Console.WriteLine("\n===== 新增图书 =====");
            Book book = new Book();

            Console.Write("请输入图书编号（整数）：");
            book.Id = int.Parse(Console.ReadLine()?.Trim() ?? "0");

            Console.Write("请输入书名：");
            book.Title = Console.ReadLine()?.Trim() ?? "";

            Console.Write("请输入作者：");
            book.Author = Console.ReadLine()?.Trim() ?? "";

            Console.Write("请输入出版社：");
            book.Publisher = Console.ReadLine()?.Trim() ?? "";

            Console.Write("请输入出版日期（格式：yyyy-MM-dd）：");
            book.PublishDate = DateTime.Parse(Console.ReadLine()?.Trim() ?? DateTime.Now.ToString("yyyy-MM-dd"));

            Console.Write("请输入价格（保留2位小数）：");
            book.Price = decimal.Parse(Console.ReadLine()?.Trim() ?? "0");

            manager.AddBook(book);
        }
        catch (FormatException)
        {
            Console.WriteLine("错误：输入格式不正确（编号/价格/日期格式错误）！");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"新增失败：{ex.Message}");
        }
    }

    // 编辑图书的交互菜单
    static void EditBookMenu(BookManager manager)
    {
        try
        {
            Console.WriteLine("\n===== 编辑图书 =====");
            Console.Write("请输入要编辑的图书编号：");
            int bookId = int.Parse(Console.ReadLine()?.Trim() ?? "0");

            // 输入新的图书信息
            Book newInfo = new Book();
            Console.Write("请输入新书名：");
            newInfo.Title = Console.ReadLine()?.Trim() ?? "";

            Console.Write("请输入新作者：");
            newInfo.Author = Console.ReadLine()?.Trim() ?? "";

            Console.Write("请输入新出版社：");
            newInfo.Publisher = Console.ReadLine()?.Trim() ?? "";

            Console.Write("请输入新出版日期（格式：yyyy-MM-dd）：");
            newInfo.PublishDate = DateTime.Parse(Console.ReadLine()?.Trim() ?? DateTime.Now.ToString("yyyy-MM-dd"));

            Console.Write("请输入新价格（保留2位小数）：");
            newInfo.Price = decimal.Parse(Console.ReadLine()?.Trim() ?? "0");

            manager.EditBook(bookId, newInfo);
        }
        catch (FormatException)
        {
            Console.WriteLine("错误：输入格式不正确（编号/价格/日期格式错误）！");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"编辑失败：{ex.Message}");
        }
    }

    // 删除图书的交互菜单
    static void DeleteBookMenu(BookManager manager)
    {
        try
        {
            Console.WriteLine("\n===== 删除图书 =====");
            Console.Write("请输入要删除的图书编号：");
            int bookId = int.Parse(Console.ReadLine()?.Trim() ?? "0");
            manager.DeleteBook(bookId);
        }
        catch (FormatException)
        {
            Console.WriteLine("错误：编号必须是整数！");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"删除失败：{ex.Message}");
        }
    }
}